#include<func.h>
#include <unistd.h>
// copyDir.c
void copyFile(const char* src, const char* dst);
void copyDir(const char* src, const char* dst);
int main(int argc, char* argv[]) {
    // ./copyDir src dst
    ARGS_CHECK(argc, 3);
    copyDir(argv[1], argv[2]);
    return 0;
}
//复制该路径下的文件到另外一个目录里面去
void copyFile(const char* src, const char* dst) {
    // 复制文件 
    //打开源路径下的文件
    FILE* src_fp = fopen(src,"r");
    ERROR_CHECK(src_fp,NULL,"src_fp is NULL");//报错
    FILE*dst_fp =fopen(dst,"w");
    ERROR_CHECK(dst_fp,NULL,"dst_fp is NULL");//报错
    //复制
    char str[1024];
    while(fgets(str,sizeof(str),src_fp)!=NULL)
    {
        fputs(str,dst_fp);
    }
    //关闭文件流
    fclose(src_fp);
    fclose(dst_fp);
}
void copyDir(const char* src, const char* dst) {
    // 创建dst目录
    //判断是否创建成功
    int ret = mkdir(dst,0777);
    ERROR_CHECK(ret,-1,"mkdir is not sus");
    // 打开src目录
    DIR*pdir = opendir(src);
    ERROR_CHECK(pdir,NULL,"opendir");
    errno = 0;
    // 遍历目录流
    struct dirent*pdirent;
    while((pdirent = readdir(pdir))!= NULL) {
        // 忽略.和..
        char*name = pdirent->d_name;
        if(name[0]=='.')
        {
            continue;
        }

        //在dst目录下创建该目录
        char subpath[1024];
        char srcpath[1024];
        //path/name 新目录 两边都更新目录 递归进去
        sprintf(srcpath,"%s/%s",src,name);
        sprintf(subpath,"%s/%s",dst,name);

        // 如果该目录项是目录，则调用copyDir递归复制
        if(pdirent->d_type == DT_DIR)
        {
            copyDir(srcpath,subpath);
        } else if(pdirent->d_type == DT_REG)
        {
            copyFile(srcpath,subpath);
        }
    } // pdirent == NULL

    // 关闭目录流
    
    if(errno)
    {
        closedir(pdir);
        perror("readdir");
        exit(1);
    }
    closedir(pdir);
}